home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1996 #6 / Amiga Plus CD - 1996 - No. 06.iso / pd / programmierung / proasm / routines / patch.r < prev    next >
Text File  |  1994-04-01  |  3KB  |  191 lines

  1.  
  2. ;---;  patch.r  ;--------------------------------------------------------------
  3. *
  4. *    ****    LIBRARY FUNCTION PATCH ROUTINES    ****
  5. *
  6. *    Author        Stefan Walter
  7. *    Version        0.10
  8. *    Last Revision    28.03.94
  9. *    Identifier    plf_defined
  10. *    Prefix        plf_    (Patch library functions)
  11. *                 ¯     ¯       ¯
  12. *    Functions    PatchList, UnPatchList, CheckUnPatch
  13. *
  14. ;------------------------------------------------------------------------------
  15.  
  16. ;------------------
  17.     ifnd    plf_defined
  18. plf_defined    =1
  19.  
  20. ;------------------
  21. plf_oldbase    equ __base
  22.     base    plf_base
  23. plf_base:
  24.  
  25. ;------------------
  26.  
  27. ;------------------------------------------------------------------------------
  28. *
  29. * PatchList    Patch libraries using a list.
  30. *
  31. * INPUT        a0    List.
  32. *        d0    Bitfield of entries to concider.
  33. *
  34. ;------------------------------------------------------------------------------
  35.     IFD    xxx_PatchList
  36. PatchList:
  37.     movem.l    d0-a6,-(sp)
  38.     lea    plf_base(pc),a4
  39.     move.l    a0,a3
  40.     move.l    d0,d7
  41.     move.l    4.w,a6
  42.  
  43. .loop:    move.w    (a3)+,d0
  44.     beq.s    .done
  45.     and.w    d7,d0
  46.     beq.s    .next
  47.  
  48.     move.w    (a3)+,a1
  49.     add.l    a4,a1
  50.     move.l    (a1),a1
  51.     move.w    (a3)+,a0
  52.     move.w    (a3)+,d0
  53.     ext.l    d0
  54.     add.l    a4,d0
  55.     jsr    -420(a6)        ;SetFunction()
  56.     move.l    d0,(a3)
  57.     subq.w    #6,a3
  58.  
  59. .next:    lea    10(a3),a3
  60.     bra.s    .loop
  61.  
  62. .done:    movem.l    (sp)+,d0-a6
  63.     rts        
  64.  
  65.  
  66.     ENDIF
  67.  
  68. ;------------------
  69.  
  70. ;------------------------------------------------------------------------------
  71. *
  72. * UnPatchList    Remove library patches using a list. Call this under Forbid()
  73. *        after having checked with CheckUnPatch.
  74. *
  75. * INPUT        a0    List.
  76. *        d0    Bitfield of entries to concider.
  77. *
  78. ;------------------------------------------------------------------------------
  79.     IFD    xxx_UnPatchList
  80. UnPatchList:
  81.     movem.l    d0-a6,-(sp)
  82.     lea    plf_base(pc),a4
  83.     move.l    a0,a3
  84.     move.l    d0,d7
  85.     move.l    4.w,a6
  86.  
  87. .loop:    move.w    (a3)+,d0
  88.     beq.s    .done
  89.     and.w    d7,d0
  90.     beq.s    .next
  91.  
  92.     move.w    (a3)+,a1
  93.     add.l    a4,a1
  94.     move.l    (a1),a1
  95.     move.w    (a3)+,a0
  96.     move.l    2(a3),d0
  97.     jsr    -420(a6)        ;SetFunction()
  98.     subq.w    #4,a3
  99.  
  100. .next:    lea    10(a3),a3
  101.     bra.s    .loop
  102.  
  103. .done:    movem.l    (sp)+,d0-a6
  104.     rts        
  105.  
  106.  
  107.     ENDIF
  108.  
  109. ;------------------
  110.  
  111. ;------------------------------------------------------------------------------
  112. *
  113. * CheckUnPatch    Check if all entries can be unpatched. Call under Forbid()!
  114. *
  115. * INPUT        a0    List.
  116. *        d0    Bitfield of entries to concider.
  117. *
  118. * RESULT    d0    0 if all okay, else -1.
  119. *        ccr    On d0.
  120. *
  121. ;------------------------------------------------------------------------------
  122.     IFD    xxx_CheckUnPatch
  123. CheckUnPatch:
  124.     movem.l    d1-a6,-(sp)
  125.     lea    plf_base(pc),a4
  126.     move.l    a0,a3
  127.     move.l    d0,d7
  128.     move.l    4.w,a6
  129.  
  130. .loop:    move.w    (a3)+,d0
  131.     beq.s    .okay
  132.     and.w    d7,d0
  133.     beq.s    .next
  134.  
  135.     move.w    (a3)+,a1
  136.     add.l    a4,a1
  137.     move.l    (a1),a1
  138.     move.w    (a3)+,a0
  139.     movem.l    a0/a1,-(sp)
  140.     move.l    2(a3),d0
  141.     jsr    -420(a6)        ;SetFunction()
  142.     move.l    d0,d4
  143.     movem.l    (sp)+,a0/a1
  144.     jsr    -420(a6)        ;SetFunction()
  145.     move.w    (a3),d0
  146.     ext.l    d0
  147.     add.l    a4,d0
  148.     sub.l    d4,d0            ;still there?
  149.     bne.s    .done
  150.     subq.w    #4,a3
  151.  
  152. .next:    lea    10(a3),a3
  153.     bra.s    .loop
  154.  
  155. .okay:    moveq    #0,d0
  156. .done:    movem.l    (sp)+,d1-a6
  157.     rts        
  158.  
  159.  
  160.     ENDIF
  161.  
  162. ;------------------
  163.  
  164. ;--------------------------------------------------------------------
  165.  
  166. PLFPatch_    MACRO        ;libbase, vector, new, old_label, flag
  167.     IFC    '\5',''
  168.     dc.w    -1
  169.     ELSE
  170.     dc.w    \5
  171.     ENDC
  172.     dc.w    \1-plf_base,\2,\3-plf_base
  173. \4:    dc.l    0
  174.     ENDM
  175.  
  176. PLFEnd_    MACRO
  177.     dc.w    0
  178.     ENDM
  179.  
  180.  
  181. ;--------------------------------------------------------------------
  182.  
  183. ;------------------
  184.     base    plf_oldbase
  185.  
  186. ;------------------
  187.     endif
  188.  
  189.     end
  190.  
  191.